package com.example.springboottest.example.map;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 按照Hash值存储键值，排序
 * 排序不是按照键的hash值排序，而是按照插入或者使用顺序排序！！！
 * 默认是按照插入顺序的！！！
 * accessOrder设置为true，则使用访问顺序！！！
 * 所谓使用  即调用map的get或put方法！！！
 * 其中使用顺序很容易构造构造出缓存技术LRU !!!
 * LRU= Least Recently Used = 最近最少使用
 */
public class LinkedHashMapTest {
    public static void main(String[] args) {
        //默认是按照插入顺序的
        Map<String, Integer> map = new LinkedHashMap<>();
        map.put("a", 500);
        map.put("c", 300);
        map.put("b", 200);
        map.get("a");
        map.put("d", 100);

        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey() + " " + entry.getValue());
        }


        //accessOrder设置为true，则使用访问顺序
        Map<String, Integer> map2 = new LinkedHashMap<>(16, 0.75f, true);
        map2.put("a", 500);
        map2.put("c", 300);
        map2.put("b", 200);
        map2.get("a");
        map2.put("d", 100);

        for (Map.Entry<String, Integer> entry : map2.entrySet()) {
            System.out.println(entry.getKey() + " " + entry.getValue());
        }

        //自定义LRUCache实现LinkedHashMap,充当缓存，最多放置3条数据
        //因为b数据长期不用，被清掉
        Map<String, Object> cache = new LRUCache<>(3);
        cache.put("a", "abstract");
        cache.put("b", "basic");
        cache.put("c", "call");
        cache.get("a");
        cache.put("d", "call");
        System.out.println(cache);
    }
}
